home *** CD-ROM | disk | FTP | other *** search
- TITLE scrn2.asm
-
- ; AUTHOR Tim Spencer - Compuserve [73657,1400]
- ; DATE March 15, 1987
-
- _TEXT SEGMENT BYTE PUBLIC 'CODE'
- _TEXT ENDS
-
- _DATA SEGMENT WORD PUBLIC 'DATA'
-
- SCRN STRUC ; screen data structure - defined in video.h
- off dw 0 ; offset (cursor position)
- seg dw 0 ; screen buffer address
- port dw 0 ; status port address
- attrib dw 0 ; attribute to use
- cgacrd dw 0 ; retrace checking enabled if not zero
- SCRN ENDS
-
- _DATA ENDS
-
- DGROUP GROUP _DATA
- ASSUME CS:_TEXT, DS:DGROUP, SS:DGROUP, ES:NOTHING
-
-
- _TEXT SEGMENT BYTE PUBLIC 'CODE'
-
- ;-----------------------------------------------------------------------;
- ; scrn_puts - MSC callable routine for printing a string directly to ;
- ; the screen buffer. ;
- ; ;
- ; Usage: scrn_puts(string, attribute, &structure_name); ;
- ;-----------------------------------------------------------------------;
- _DATA SEGMENT
- scrn_puts_args STRUC ; args as pushed by calling program
- dw 0 ; saved bp value
- dw 0 ; return address
- str_ptr dw 0 ; address of string
- sstruc dw 0 ; pointer to SCRN structure
- scrn_puts_args ENDS
- _DATA ENDS
-
- PUBLIC _scrn_puts
-
- _scrn_puts PROC NEAR
- push bp ;set up frame pointer
- mov bp,sp
- push di
- push si
- mov si,[bp].str_ptr ; get the string pointer
- mov bx,[bp].sstruc ; get pointer to SCRN structure
- les di,dword ptr[bx].off ; put offset in di, buffer addr in es
- mov ch,byte ptr[bx].attrib ; put attribute in cx
- mov dx,[bx].port ; get status port address
-
- load_one:
- lodsb ; load a char and advance str ptr
- or al,al ; is it null ?
- jz puts_exit ; yes, lovely chatting. Chow babe.
- mov cl,al ; no, save in cl for a few millisecs
- cmp [bx].cgacrd, 0 ; cga card present?
- jnz swait1 ; yes...go wait
- mov ax,cx ; no.
- stosw ; write it
- jmp short load_one ; as fast as you can!
- swait1:
- in al, dx ; wait for end of retrace
- shr al, 1 ; test horizontal trace bit
- jc swait1 ; loop if still tracing
- cli ; disable writus interuptus
- swait2:
- in al, dx ; now wait until the very moment
- shr al, 1 ; when the next retrace begins
- jnc swait2 ; still waiting...
- mov al,cl ; load the char into al for stosb
- stosb ; write it and update pointer
- sti ; enable interrupts again
- swait3:
- in al, dx ; repeat these steps for the attribute
- shr al, 1
- jc swait3
- cli
- swait4:
- in al, dx
- shr al, 1
- jnc swait4
- mov al,ch ; load the attribute
- stosb
- sti
- jmp short load_one ; and get another
-
- puts_exit:
- mov [bx].off,di ; save new offset ( cur pos )
- pop si
- pop di
- pop bp
- ret
- _scrn_puts ENDP
-
-
-
- ;-----------------------------------------------------------------------;
- ; scrn_putca - MSC callable function to print a char and attribute ;
- ; directly to the screen buffer. The logical cursor ;
- ; position IS UPDATED on return. ;
- ; ;
- ; Usage: scrn_putca(char, attribute, &structure_name ;
- ;-----------------------------------------------------------------------;
- _DATA SEGMENT
- scrn_putca_args STRUC ; args as pushed by calling program
- dw 0 ; saved bp value
- dw 0 ; return address
- pchar dw 0 ; char to write
- pstruc dw 0 ; pointer to SCRN structure
- scrn_putca_args ENDS
- _DATA ENDS
-
- PUBLIC _scrn_putca
-
- _scrn_putca PROC NEAR
- push bp ; set up frame pointer
- mov bp,sp
- push di
- mov bx,[bp].pstruc ; get pointer to SCRN structure
- les di,dword ptr[bx].off ; get offset in di, buffer addr in es
- mov dx,[bx].port ; status port address
- mov ch,byte ptr[bx].attrib ; get attribute into ch
- mov cl,byte ptr[bp].pchar ; and char into cl
- cmp [bx].cgacrd, 0 ; cga card present?
- jnz cwait1 ; yes...go wait
- mov ax,cx ; no.
- stosw ; write it
- jmp short cexit ; exit.
-
- cwait1:
- in al, dx ; wait for end of retrace
- shr al, 1 ; test horizontal trace bit
- jc cwait1 ; loop if still tracing
- cli ; disable writus interuptus
- cwait2:
- in al, dx ; now wait until the very moment
- shr al, 1 ; when the next retrace begins
- jnc cwait2 ; still waiting...
- mov al,cl ; load the char into al for stosb
- stosb ; write it and update pointer
- sti ; enable interrupts again
- cwait3:
- in al, dx ; repeat these steps for the attribute
- shr al, 1
- jc cwait3
- cli
- cwait4:
- in al, dx
- shr al, 1
- jnc cwait4
- mov al,ch ; load the attribute
- stosb
- sti ; whew...all done...enable interrupts
- cexit:
- mov [bx].off, di ; update logical cursor position
- pop di ; (offset) before leaving
- pop bp
- ret
- _scrn_putca ENDP
-
-
- ;-----------------------------------------------------------------------;
- ; _scrn_getca - get char and attrib from screen ;
- ; ;
- ; usage: char = scrn_getca(&attrib,p_scn_data) ;
- ; ;
- ;-----------------------------------------------------------------------;
- _DATA SEGMENT
- getca_args STRUC ; input arguments
- dw 0 ; saved BP value
- dw 0 ; return address
- gattrib dw 0 ; store attribute here
- gstruct dw 0 ; pointer to SCRN
- getca_args ENDS
- _DATA ENDS
-
- PUBLIC _scrn_getca
-
- _scrn_getca PROC NEAR
- push bp ; set up frame pointer
- mov bp,sp
- push si
-
- mov bx,[bp].gstruct ; get pointer to SCRN structure
- mov dx,[bx].port ; get status port address
- push ds ; lds uses ds - must save
- lds si,dword ptr[bx].off ; get offset and segment address
- gwait1:
- in al, dx ; wait for end of retrace
- shr al, 1 ; test horizontal trace bit
- jc gwait1 ; loop if still tracing
- cli ; disable writus interuptus
- gwait2:
- in al, dx ; now wait until the very moment
- shr al, 1 ; when the next retrace begins
- jnc gwait2 ; still waiting...
- lodsb ; get the char into al
- sti ; enable interrupts again
- mov cl,al ; save the char in cl
- gwait3:
- in al, dx ; repeat these steps for the attribute
- shr al, 1
- jc gwait3
- cli
- gwait4:
- in al, dx
- shr al, 1
- jnc gwait4
- lodsb ; get the attribute in al
- sti
- pop ds ; restore data segment to norm
- mov word ptr [bx],si ; update offset (logical cursor)
- mov si,word ptr[bp].gattrib ; get address to store attrib
- mov byte ptr [si],al ; store the attribute at "&attrib"
- mov al,cl ; move the char to al and
- xor ah,ah ; zero out ah so that ax = char,
- ; the return value
- pop si
- pop bp
- ret
- _scrn_getca ENDP
-
- _TEXT ENDS
-
- END
-